home *** CD-ROM | disk | FTP | other *** search
/ Leonardo the Inventor / Leonardo The Inventor (93026)(Broderbund)(Riverdeep)(2004).iso / LEOWINMV / DATABASE.DIR / 00111_Script_ADD TITLES TO INDEX < prev    next >
Text File  |  1996-03-28  |  9KB  |  241 lines

  1. -- ---------------------------------------------------------------
  2. -- NOTE: TO MAKE THIS WORK, THE LIST OF WORDS IN FIELD
  3. -- "NONSEARCHABLEBROWSERWORDS" MUST BE IN REVERSE ALPHABETICAL ORDER!!!
  4. -- ---------------------------------------------------------------
  5. on addtitlesToIndex
  6.   getNonSearchableBrowserWords
  7.   reverseSortNonSearchableWords
  8.   addNonSearchableWordsToIndex
  9. end
  10.  
  11. -- --------------------------------------------------------------
  12. -- Handler getNonSearchableBrowserWords return a lisf of words in the browser topics
  13. -- that are not searchable.
  14.  
  15. on getNonSearchableBrowserWords
  16.   initIndexIndex
  17.   
  18.   set browser = field "browserTopics"
  19.   
  20.   set searchline = 1
  21.   
  22.   repeat with i = 1 to the number of lines in browser
  23.     repeat with j = 1 to the number of words in line i of browser
  24.       set currentWord = word j of line i of browser
  25.       
  26.       if endsWithPunctuation(currentWord) then
  27.         set currentWord = removePunctuationFromEnd(currentWord)
  28.       end if
  29.       if beginsWithPunctuation(currentWord)  then
  30.         set currentWord = removePunctuationFromBeginning(currentWord)
  31.       end if
  32.       
  33.       if isIgnorableWord(currentWord) then
  34.         next repeat
  35.       end if
  36.       
  37.       set searchResults = getIndexIndexData(currentWord)
  38.       
  39.       if (searchResults = EMPTY) then
  40.         put currentWord & ":" & line i of browser into line searchline of field "nonSearchableBrowserWords"
  41.         set searchline = searchline + 1
  42.       else if NOT(searchResults contains line i of browser) then
  43.         put currentWord & ":" & line i of browser into line searchline of field "nonSearchableBrowserWords"
  44.         set searchline = searchline + 1
  45.       end if
  46.     end repeat
  47.     put "finished" && line i of browser
  48.   end repeat
  49. end
  50.  
  51. -- ---------------------------------------------------------------
  52. -- Handler addNonSearchableWordsToIndex takes the words in field
  53. -- nonSearchableWords and adds them to the appropriate index fields.
  54. -- NOTE: to make this reusable, change the format of the field
  55. -- nonSearchableWords.
  56.  
  57. on addNonSearchableWordsToIndex
  58.   global nonSearchableBrowserWords
  59.   
  60.   set nonSearchableBrowserWords = field "nonSearchableBrowserWords"
  61.   
  62.   repeat with i = 1 to the number of lines in nonSearchableBrowserWords
  63.     set the itemDelimiter = ":"
  64.     
  65.     -- get the nonSearchable word
  66.     set newWord = item 1 of line i of nonSearchableBrowserWords
  67.     put newWord
  68.     -- get the browser topic containing the nonSearchable word
  69.     set browserTopic = item 2 of line i of nonSearchableBrowserWords
  70.     
  71.     -- search the indexIndex for the word
  72.     set indexCastAndLineList = getIndexCastAndLine(newWord)
  73.     set indexCast = getAt(indexCastAndLineList,2)
  74.     set indexCastLine = getAt(indexCastAndLineList,3)
  75.     
  76.     -- determine if the word exists as an entry or not
  77.     set existsAlreadyFlag = getAt(indexCastAndLineList,1)
  78.     
  79.     if existsAlreadyFlag then
  80.       -- the entry already exists, just needs to be updated
  81.       updateEntryInIndex(newWord, browserTopic, indexCast, indexCastLine, existsAlreadyFlag)
  82.     else
  83.       -- the entry doesn't exist, add it
  84.       -- get the new entry
  85.       set newEntry = getNewEntry(newWord,list(browserTopic))
  86.       
  87.       -- add the entry to the index
  88.       addSingleEntryToIndex(newEntry, indexCast, indexCastLine)
  89.     end if
  90.   end repeat
  91.   
  92.   set the itemDelimiter = ","
  93. end
  94.  
  95. -- ---------------------------------------------------------------
  96. -- Handler getIndexCastAndLine
  97.  
  98. on getIndexCastAndLine wordToAdd
  99.   -- start with the first indexIndex.  See if it fits in there. If so,
  100.   -- get the cast to add to from item 2 of the line. If not, move on
  101.   -- to indexIndex 2, 3, and so on until 12.
  102.   
  103.   repeat with i = 1 to 13
  104.     set theIndexIndex = field("indexIndex" && i)
  105.     set indexCastAndLine = getEntryLocation(wordToAdd, theIndexIndex)
  106.     
  107.     if (indexCastAndLine = -1) then -- doesn't fit in this indexIndex
  108.       next repeat
  109.     else
  110.       return indexCastAndLine
  111.     end if
  112.   end repeat
  113.   
  114.   if (i = 13) then -- didn't fit in any indexIndex, add to last index
  115.     alert "need to add at end of 13"
  116.   end if
  117. end
  118.  
  119. -- ---------------------------------------------------------------
  120. -- Handler getEntryLocation
  121.  
  122. on getEntryLocation wordToAdd, theIndexIndex
  123.   
  124.   -- get the last line in the indexIndex that has an entry
  125.   set continue = TRUE
  126.   set indexIndexLines = the number of lines in theIndexIndex
  127.   repeat while continue
  128.     if (item 1 of line indexIndexLines of theIndexIndex = EMPTY) then
  129.       set indexIndexLines = indexIndexLines - 1
  130.     else
  131.       set continue = FALSE
  132.     end if
  133.   end repeat
  134.   
  135.   -- quick check: if wordToAdd > the last entry then it doesn't fit in this indexIndex
  136.   if (item 1 of line indexIndexLines of theIndexIndex < wordToAdd) then
  137.     return -1
  138.   else  -- fits in this indexIndex
  139.     repeat with i = 1 to indexIndexLines
  140.       if (item 1 of line i of theIndexIndex > wordToAdd) then
  141.         return list(0,value(item 2 of line i of theIndexIndex), value(item 3 of line i of theIndexIndex))
  142.       else if (item 1 of line i of theIndexIndex = wordToAdd) then
  143.         -- entry already exists, just update its search results
  144.         -- return as the first item of the list, the line number of
  145.         -- the next index entry.
  146.         return list(value(item 3 of line (i+1) of theIndexIndex),value(item 2 of line i of theIndexIndex), value(item 3 of line i of theIndexIndex))
  147.       end if      
  148.     end repeat
  149.   end if
  150.   
  151.   return -1 -- didn't fit in then indexIndex
  152. end
  153.  
  154. -- ---------------------------------------------------------------
  155. -- Handler getNewEntry puts the given entry and entryList in index
  156. -- format (asterisk followed by entry followed by return followed
  157. -- by list of articles containing the entry)
  158.  
  159. on getNewEntry  entry, entryList
  160.   set newEntry = "*" & entry
  161.   
  162.   repeat with i = 1 to count(entryList)
  163.     set newEntry = newEntry & RETURN & getAt(entryList,i)
  164.   end repeat
  165.   
  166.   return newEntry
  167. end
  168.  
  169. -- ---------------------------------------------------------------
  170. -- Handler addSingleEntryToIndex adds the given entry to the given
  171. -- indexCast before the given indexCastLine
  172.  
  173. on addSingleEntryToIndex newEntry, indexCast, indexCastLine
  174.   set numLines = the number of lines in the text of cast indexCast
  175.   set beforeEntryIndex = line 1 to (indexCastLine-1) of the text of cast indexCast
  176.   set afterEntryIndex = line indexCastLine to numLines of the text of cast indexCast
  177.   set newIndex = beforeEntryIndex & RETURN & newEntry & RETURN & afterEntryIndex
  178.   set the text of cast indexCast = newIndex
  179. end
  180.  
  181. -- ---------------------------------------------------------------
  182. -- Handler updateEntryInIndex adds the given line to the search results
  183. -- of the given newWord. The previous search results are found
  184. -- in the given indexCast at the given indexCastLine. NOTE: can't
  185. -- use indexIndex to get the starting line of the next index entry
  186. -- because this code will be chaning the index casts and the numbers
  187. -- in the index index will no longer be relevant.
  188.  
  189. on updateEntryInIndex newWord, newTopic, indexCast, indexCastLine, nextEntryLine
  190.   set numLines = the number of lines in the text of cast indexCast
  191.   set beforeEntryIndex = line 1 to (indexCastLine-1) of the text of cast indexCast
  192.   set afterEntryIndex = line nextEntryLine to numLines of the text of cast indexCast
  193.   set oldEntry = getEntry(indexCast, indexCastLine, nextEntryLine)
  194.   set newEntry = getEntryWithAddedTopic(oldEntry, newTopic)
  195.   set newIndex = beforeEntryIndex & RETURN & newEntry & RETURN & afterEntryIndex
  196.   set the text of cast indexCast = newIndex
  197. end
  198.  
  199. -- ---------------------------------------------------------------
  200. -- Handler getEntry returns the entry between the given lines of the
  201. -- given indexCast.
  202.  
  203. on getEntry indexCast, indexCastLine, nextEntryLine
  204.   return line indexCastLine to (nextEntryLine - 1) of the text of cast indexCast
  205. end
  206.  
  207. -- ---------------------------------------------------------------
  208. -- Handler getEntryWithAddedTopic returns the new entry composed
  209. -- of the given oldEntry with the newTopic inserted in the proper
  210. -- place.
  211.  
  212. on getEntryWithAddedTopic oldEntry, newTopic
  213.   set entryWithAddedTopic = line 1 of oldEntry -- "*" && the word
  214.   set numLines = the number of lines in oldEntry
  215.   
  216.   repeat with i = 2 to numLines
  217.     if (line i of oldEntry > newTopic) then
  218.       return entryWithAddedTopic & RETURN & newTopic & RETURN & line i to numLines of oldEntry
  219.     else
  220.       set entryWithAddedTopic = entryWithAddedTopic & RETURN & line i of oldENTRY
  221.     end if
  222.   end repeat
  223.   
  224.   return entryWithAddedTopic & RETURN & newTopic
  225. end
  226.  
  227. on reverseSortNonSearchableWords
  228.   set numLines = the number of lines in field "nonSearchableBrowserWords"
  229.   
  230.   set list = []
  231.   repeat with i = 1 to numLines
  232.     add list, line i of field "nonSearchableBrowserWords"
  233.   end repeat
  234.   
  235.   sort list
  236.   
  237.   put empty into field "nonSearchableBrowserWords"
  238.   repeat with i = numLines down to 1
  239.     put getAt(list, i) & RETURN after field "nonSearchableBrowserWords"
  240.   end repeat
  241. end